Parallel Braings - Параллельные Мозги - Лабораторная 2

Семинары по параллельному программированию

Рыбинск, РГАТА 2007

Список семинаров Форум Ссылки

Лабораторная работа №2
Многопоточное программирование. Threading in C#

Задача #2 - Threads VS Processes

Краткое описание:
Известно, что для параллельного программирования в инструментарии современных ОС имеются две сущности - процессы и потоки. Необходимо провести сравнение потоков и процессов по следующим критериям (учитывая доп.ограничения (см.ниже)):

  1. Время создания 1 процесса в зависимости от объема выделяемой памяти
  2. Время создания 1 процесса (пункт 1 при объеме выделяемой памяти = 0)
  3. Время создания 1 потока
  4. Временные затраты на диспетчеризацию процессов
  5. Временные затраты на диспетчеризацию потоков

p.s. Для замеров времени Вы можете использовать Utility.PerfCounter или System.DateTime.Now;

Неформальное описание:
Строго говоря, понятие процесса в терминологии операционных систем не относится к активной сущности - активным элементом может быть только поток.
Процесс же представляет собой некоторую служебную информацию (имя приложения, handle окна,...), некоторые структуры (контекст) и ассоциированную с ними память. В том же случае когда говорят о процессе как об активной сущности имеют в виду, что в рамках процесса активен только 1 поток.
Цель данной задачи - провести ряд замеров и сравнить временные характеристики потоков и процессов. А также сравнить эти величины с аналогичными показателями ОС QNX. Кроме того, на решение налагаются дополнительные ограничения.
При работе с процессами, необходимо реализовать логику порождения процессов аналогично логике команды fork QNX API. Аналогия в данном случае будет заключаться в том, что при создании нового процесса, вы должны создавать тот же самый процесс. Т.е. по сути дела создавать дубль запущенного процесса.
Это ограничение означает, что если Ваша программа находиться в исполняемом файле MyLab2.exe, то при создании нового процесса в Вашей программе Вы должны запустить на исполнение сам MyLab2.exe.

Ниже будет приведен псевдокод, иллюстрирующий схему замеров:

1. Время создания 1 процесса в зависимости от объема выделяемой памяти

процесс "X":
  Выделить память объемом N;  //где N - количество мегабайт, задаваемое пользователем
  Timer.Start();
  запустить процесс "X";
  дождаться завершения запущенного процесса;
  Timer.Stop();
  Вывести результаты;
2. Время создания 1 потока
процесс "X":
  Timer.Start();
  запустить поток;
  дождаться завершения запущенного потока;
  Timer.Stop();
  Вывести результаты;
3. Временные затраты на диспетчеризацию K-процессов
//где K - количество процессов, задаваемое пользователем
функция F(кол_итераций):
   for(кол_итераций) имитация_большого_объема_работы;
процесс "X":
  K раз:
    запустить процесс "X" и вызвать в нем F(1000);
  Timer.Start();
  K раз:
    запустить процесс "X" и вызвать в нем F(1000);
  дождаться завершения запущенных процессов;
  Timer.Stop();
  Вывести результаты;
4. Временные затраты на диспетчеризацию K-потоков
//где K - количество потоков, задаваемое пользователем
функция F(кол_итераций):
   for(кол_итераций) имитация_большого_объема_работы;
процесс "X":
  Timer.Start();
  K раз:
    запустить поток и вызвать в нем F(1000);
  дождаться завершения запущенных потоков;
  Timer.Stop();
  Вывести результаты;
Для наглядности проделать туже работу (1000*K раз сымитировать большой_объем_работы) в одном потоке (последовательно):
функция F(кол_итераций):
   for(кол_итераций) имитация_большого_объема_работы;
процесс "X":
  Timer.Start();
  F(1000*K);
  дождаться завершения запущенных потоков;
  Timer.Stop();
  Вывести результаты;
Подобные замеры приводятся в книге [1], посвященной ОС QNX. Ниже приведены исходные коды программ замеров и результаты замеров.
Интересно сравнить временные показатели работы процессов и потоков в Windows и QNX.
1. Время создания 1 процесса в зависимости от объема выделяемой памяти (p2-1.cc)
Время создания (msec) Объем памяти (Mb)
3.43330
17.07061
31.52572
70.72345
264.04220
661.31250
1169.45100
Как вы можете видеть, наблюдается значительный рост времени создания процесса при росте объема выделяемой памяти.
2. Время создания 1 потока(p2-2.cc)
Время на создание одного потока в QNX составило 0.147139 msec, если сравнить это время с временем создания процесса (при 0Mb выделяемой памяти), то видно что разница составляет 3-4 раза.

3. Временные затраты на диспетчеризацию K-процессов(p4-1.cc), K-потоков(p4-2.cc) и время последовательного выполнения эквивалентной работы(p4-3.cc)
K=10
Тип активного элемента Время исполнения (msec)
Процессы5962.21
Потоки5919.82
1 поток5928.8
Интересные выводы предстоит сделать Вам самим.

Содержание отчета к л.р.:

  1. Исходный код программы (или нескольких версий программы)
  2. Таблица временных замеров для каждого эксперимента
  3. Результаты сравнения ОС QNX и ОС Windows

Возможные ошибки:

Отсчет времени заканчивается до завершения работы активных элементов (процессов\потоков)

[1] Цилюрик О., Горошко Е. QNX/UNIX: анатомия параллелизма. - СПб.: Символ-Плюс, 2006

QNX vs Windows


Сравнение ОС Windows и OC QNX представляется не совсем корректным, поскольку данные ОС принадлежат к разным классам ОС (NonRTS и RTS) и семействам ОС (Windows-way и Unix-way).

Но дело не только в различии API (так QNX API является POSIX, а WinAPI нет), дело ещё и в кардинальных архитектурных различиях.
Так в частности в QNX программист может изменить значения самого кванта времени, который планировщик отдает потоку на исполнение. Может изменить дисциплину диспетчеризации потоков.
Кроме того отличительной чертой QNX являются сигналы реального времени - по сути дела высокоуровневые обработчики событий (прерываний), которые могут вытеснить даже исполняющиеся функции ядра системы - в Windows же вытеснение исполняющихся функций ядра не возможно в принципе.

Сайт создан в системе uCoz